package informationextraction;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javaparser.Java7InformationListener;
import javaparser.Java7Parser;
import javaparser.Java7Parser.ArgumentsContext;
import javaparser.Java7Parser.ExpressionContext;
import javaparser.Java7Parser.IdentifierTypeArgumentContext;
import javaparser.Java7Parser.LocalVariableDeclarationContext;
import javaparser.Java7Parser.NormalClassDeclarationContext;
import javaparser.Java7Parser.PrimaryContext;

import org.antlr.v4.runtime.RuleContext;

import commandset.ECast;

public class ECastExtraction extends InfoExtraction {

	List<ECast> list_ecast = new ArrayList<ECast>();

	public ECastExtraction(Java7InformationListener info) {
		super(info);
		// TODO Auto-generated constructor stub
	}

	public List<ECast> getEcast() {
		return list_ecast;
	}

	public void setInfoForECast() {
		List<String> variable_names = getListVariableNameOfIntent();
		Iterator<String> itr = variable_names.iterator();
		while (itr.hasNext()) {
			ECast ecast = new ECast();
			String variable_name = itr.next();
			if (getComponentID(variable_name) != null) {
				ecast.setVariable_name(variable_name);
				ecast.setComponent_id(getComponentID(variable_name));
				ecast.setApp_id(getAppID(variable_name));
				ecast.setAction(getAction(variable_name));
				list_ecast.add(ecast);
			}

		}

	}

	public String getComponentID(String variable) {
		String name = null;
		List<PrimaryContext> list = getListMethodCallOfIntentVariablesContainsComponentName(variable);
		if (list.isEmpty() == false) {
			Iterator<PrimaryContext> itr1 = list.iterator();
			// Usually has one PrimaryContext object in list
			while (itr1.hasNext()) {
				PrimaryContext ctx = itr1.next();
				String rule = ctx.getRuleContext().getText();
				name = getComponentNames(rule);
			}

		}
		return name;
	}

	public String getAppID(String variable) {
		String name = null;
		List<PrimaryContext> list = getListMethodCallOfIntentVariablesContainsComponentName(variable);
		if (list.isEmpty() == false) {
			Iterator<PrimaryContext> itr1 = list.iterator();
			// Usually has one PrimaryContext object in list
			while (itr1.hasNext()) {
				PrimaryContext ctx = itr1.next();
				String rule = ctx.getRuleContext().getText();
				name = getAppName(rule);
			}

		}
		return name;
	}

	// Should consider other cases. Example: Intent i = new Intent(this,
	// ResultActivity.class);
	// Or:
//	public String getAction(String variable) {
//		List<PrimaryContext> list_ctx = getPrimaryContextFromArgumentContextOfIntentVariable(variable);
//		Iterator<PrimaryContext> itr = list_ctx.iterator();
//		while (itr.hasNext()) {
//			PrimaryContext pri = itr.next();
//			if (pri.getRuleContext().getText().contains("ACTION_")) {
//				return pri.Identifier(1).getText();
//			}
//		}
//		return null;
//	}

	public String getComponentNames(String str) {
		int idx1 = str.indexOf("\"");
		int idx2 = str.lastIndexOf("\"");
		String sub = str.substring(idx1, idx2 + 1);
		String[] two = sub.split(",");
		int i = two[1].lastIndexOf(".");
		String substr = two[1].substring(i + 1, two[1].length() - 1);
		return substr;
	}

	// public String getAppNameA(String str) {
	// //String comp_name = getComponentNames(str);
	// return "App" + str.substring(str.length() - 1);
	// }

//	public ArgumentsContext getArgumentsContextOfIntentVariable(
//			String variable_name) {
//		ArgumentsContext arg = null;
//		String rule = getListLocalVariableDeclarationOfIntent(variable_name)
//				.get(0).getRuleContext().getText();
//		Iterator<ArgumentsContext> itr = info.getList_argrument().iterator();
//		while (itr.hasNext()) {
//			ArgumentsContext ctx = itr.next();
//			if (rule.contains(ctx.getRuleContext().getText())) {
//				return ctx;
//			}
//		}
//		return arg;
//	}

//	public List<PrimaryContext> getPrimaryContextFromArgumentContextOfIntentVariable(
//			String variable_name) {
//		List<PrimaryContext> list_pri = new ArrayList<PrimaryContext>();
//		ArgumentsContext arg = getArgumentsContextOfIntentVariable(variable_name);
//		String rule = arg.getRuleContext().getText();
//		Iterator<PrimaryContext> itr = info.getList_primary().iterator();
//		while (itr.hasNext()) {
//			PrimaryContext ctx = itr.next();
//			if (rule.contains(ctx.getRuleContext().getText()))
//				list_pri.add(ctx);
//		}
//		return list_pri;
//	}

	public String getResouceName(String str) {
		if (str.contains(".")) {
			return str.substring(str.indexOf(".") + 1, str.length());
		}
		return null;
	}

	public String getAppName(String str) {
		if (str.contains(".")) {
			String name = str.substring(0, str.lastIndexOf("."));
			if (str.contains(".")) {
				String app_name = str.substring(name.lastIndexOf(".") + 1,
						name.length());
				return app_name;
			}
			return name;
		}
		return null;
	}
	
	public boolean isEmpty(){
		return ((list_ecast.size() == 0)? true:false);
	}

}
